﻿#define _CRT_SECURE_NO_WARNINGS 1
//题目：前缀统计
//给定 N 个字符串 S1,S2…SN，接下来进行 M 次询问，每次询问给定一个字符串 T，求 S1∼SN 中有多少个字符串是 T 的前缀。
//输入字符串的总长度不超过 106，仅包含小写字母。
//输入格式
//第一行输入两个整数 N，M。
//接下来 N 行每行输入一个字符串 Si。
//接下来 M 行每行一个字符串 T 用以询问。
//输出格式
//对于每个询问，输出一个整数表示答案。
//每个答案占一行。
//数据范围
//1≤N,M≤105
//输入样例：
//3 2
//ab
//bc
//abc
//abc
//efg
//输出样例：
//2
//0

//#include<iostream>
//using namespace std;
//
//const int N = 1000010;
//int son[N][26], cnt[N], idx;
//char cp[N];
//void insert(char cp[])
//{
//    int p = 0;
//    for (int i = 0; cp[i]; i++)
//    {
//        int u = cp[i] - 'a';
//        if (son[p][u] == 0) son[p][u] = ++idx;
//        p = son[p][u];
//    }
//    cnt[p]++;
//}
//int query(char cp[])
//{
//    int p = 0, res = 0;
//    for (int i = 0; cp[i]; i++)
//    {
//        int u = cp[i] - 'a';
//        if (son[p][u] == 0) return res;
//        p = son[p][u];
//        res += cnt[p];
//    }
//    return res;
//}
//int main()
//{
//    int n, m;
//
//    cin>> n >> m;
//    for (int i = 0; i < n; i++)
//    {
//        cin >> cp;
//        insert(cp);
//    }
//    for (int i = 0; i < m; i++)
//    {
//        cin >> cp;
//        cout << query(cp) << endl;
//    }
//    return 0;
//}


//题目：机工士姆斯塔迪奥
//在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里，BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。
//你需要处理这个副本其中的一个机制：N×M大小的地图被拆分为了 N×M个 1×1的格子，BOSS 会选择若干行或 / 及若干列释放技能，玩家不能站在释放技能的方格上，否则就会被击中而失败。
//给定 BOSS 所有释放技能的行或列信息，请你计算出最后有多少个格子是安全的。
//输入格式
//输入第一行是三个整数 N, M, Q，表示地图为 N行 M列大小以及选择的行 / 列数量。
//接下来 Q行，每行两个数 Ti和 Ci，其中 Ti = 0表示 BOSS 选择的是一整行，Ti = 1表示选择的是一整列，Ci为选择的行号 / 列号。
//行和列的编号均从 1开始。
//输出格式
//输出一个数，表示安全格子的数量。
//数据范围
//1≤N×M≤105,0≤Q≤1000。
//输入样例：
//5 5 3
//0 2
//0 4
//1 3
//输出样例：
//12

//#include<iostream>
//using namespace std;
//const int N = 100010;
//typedef long long LL;
//bool str[2][N];
//int main()
//{
//    int n, m, q;
//    cin >> n >> m >> q;
//    LL res = n * m;
//    int row = 0, col = 0;
//    while (q--)
//    {
//        int t, c;
//        cin >> t >> c;
//        if (t == 0)
//        {
//            if (!str[0][c])
//            {
//                str[0][c] = true;
//                row++;//如果喷射行，该行变成危险区域，需要++；
//                res -= m - col;
//            }
//        }
//        else
//        {
//
//            if (!str[1][c])
//            {
//                str[1][c] = true;
//                col++;//如果喷射列，该列变成危险区域，需要++；
//                res -= n - row;
//            }
//        }
//    }
//    printf("%d\n", res);
//    return 0;
//}

//题目：亲戚
//或许你并不知道，你的某个朋友是你的亲戚。
//他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子。
//如果能得到完整的家谱，判断两个人是否是亲戚应该是可行的，但如果两个人的最近公共祖先与他们相隔好几代，使得家谱十分庞大，那么检验亲戚关系实非人力所能及。
//在这种情况下，最好的帮手就是计算机。
//为了将问题简化，你将得到一些亲戚关系的信息，如Marry和Tom是亲戚，Tom和Ben是亲戚，等等。
//从这些信息中，你可以推出Marry和Ben是亲戚。
//请写一个程序，对于我们的关于亲戚关系的提问，以最快的速度给出答案。
//输入格式
//输入由两部分组成。
//第一部分以 N, M开始。N为问题涉及的人的个数。这些人的编号为 1, 2, 3, …, N。下面有 M行，每行有两个数 ai, bi，表示已知 ai和 bi是亲戚。
//第二部分以 Q开始。以下 Q行有 Q个询问，每行为 ci, di，表示询问 ci和 di是否为亲戚。
//输出格式
//对于每个询问 ci, di，输出一行：若 ci和 di为亲戚，则输出“Yes”，否则输出“No”。
//数据范围
//1≤N≤20000,1≤M≤106,1≤Q≤106
//输入样例：
//10 7
//2 4
//5 7
//1 3
//8 9
//1 2
//5 6
//2 3
//3
//3 4
//7 10
//8 9
//输出样例：
//Yes
//No
//Yes

//#include<iostream>
//using namespace std;
//const int N = 200010;
//int p[N];
//int find(int x)
//{
//    if (p[x] != x) p[x] = find(p[x]);
//    return p[x];
//}
//int main()
//{
//    int n, m;
//    scanf("%d%d", &n, &m);
//    for (int i = 1; i <= n; i++) p[i] = i;
//    while (m--)
//    {
//        int l, r;
//        scanf("%d%d", &l, &r);
//
//        if (p[find(l)] != p[find(r)])
//        {
//            p[find(l)] = p[find(r)];
//        }
//    }
//    int q;
//    scanf("%d", &q);
//    while (q--)
//    {
//        int l, r;
//        scanf("%d%d", &l, &r);
//        if (find(p[l]) == find(p[r])) printf("Yes\n");
//        else printf("No\n");
//    }
//    return 0;
//}

//题目：求m区间内得最小值
//题目描述
//一个含有n项得数列，求出每一项前得m个数列到它这个区间内得最小值。若前面得数不足m项则从第1个数开始，若前面没有数则输出0。
//输入格式
//第一行两个整数，分别表示n，m
//第二行，n个正整数，为所给定得数列ai。
//输出格式
//n行，每行一个整数，第i个数为序列中ai之前m个数得最小值
//输入
//6 2 
//7 8 1 4 3 2
//输出
//0
//7
//7
//1
//1
//3
//说明
//对于100%得数据，保证1<=m<=n<=2*10^6,1<=ai<=3*10^7
#include<iostream>
using namespace std;
const int N = 2000010;
int a[N];
int q[N];
int main()
{
	int n, m;
	cin >> n >> m;
	int hh = 0, tt = -1;
	for (int i = 0; i < n; i++) scanf("%d", &a[i]);
	printf("0 \n");
	for (int i = 1; i < n; i++)
	{
		if (hh <= tt && i - m > q[hh]) hh++;
		while (hh <= tt && a[q[tt]] > a[i - 1]) tt--;
		q[++tt] = i - 1;
		printf("%d\n", a[q[hh]]);
	}
	return 0;
}
